package cn.ronghuanet.controller;

import cn.ronghuanet.domain.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    private static final String PREFIX_URL = "http://localhost:2010";

    /**
     * 通过userId获取用户的订单
     * 入门程序存在的问题:
     * 1 如果order-service的端口或ip发生改变,要修改user-service的代码才可以
     * 2 如果order-service发生了故障宕机了,user-service不知道
     * 3 如果order-service做了集群,user-service调哪个???
     * @return
     */
/*    @GetMapping("/order/{userId}")
    public List<Order> getOrderBuUserId(@PathVariable("userId")Long userId){
        // 调order-service中的接口,获取用户所拥有的订单
        List<Order> object = restTemplate.getForObject(this.PREFIX_URL+"/order/userid/"+userId, List.class);
        return object;
    }*/


    @GetMapping("/order/{userId}")
    public List<Order> getOrderBuUserId(@PathVariable("userId")Long userId){
        // 在以后的微服务调用之中,是不用我们自己手动根据服务名去找到服务实例的,只是我们现在还没有学习其他的组件,所以我们目前需要自己手动
        // 发现服务实例
        List<ServiceInstance> instances = discoveryClient.getInstances("order-service");
        // 实际应用中应该根据负载均衡策略选择合适的服务来进行调用,我们现在先写死获取第一个实例
        ServiceInstance instance = instances.get(0);
        // 根据获得的实例,拼接order-service的调用地址
        String host = instance.getHost();
        int port = instance.getPort();
        String url = "http://"+host+":"+port+"/order/userid/"+userId;
        List<Order> forObject = restTemplate.getForObject(url, List.class);
        return forObject;
    }
}
